home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / gtlayout-source.lha / LT_GetAttributes.c < prev    next >
C/C++ Source or Header  |  1996-10-08  |  9KB  |  439 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1996 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. LONG
  15. LT_GetAttributes(LayoutHandle *Handle,LONG ID,...)
  16. {
  17.     va_list VarArgs;
  18.     LONG    Result;
  19.  
  20.     va_start(VarArgs,ID);
  21.     Result = LT_GetAttributesA(Handle,ID,(struct TagItem *)VarArgs);
  22.     va_end(VarArgs);
  23.  
  24.     return(Result);
  25. }
  26.  
  27.  
  28. /*****************************************************************************/
  29.  
  30.  
  31. /****** gtlayout.library/LT_GetAttributesA ******************************************
  32. *
  33. *   NAME
  34. *    LT_GetAttributesA -- Inquire information on a gadget.
  35. *
  36. *   SYNOPSIS
  37. *    Value = LT_GetAttributesA(Handle,ID,Tags);
  38. *      D0                        A0   D0  A1
  39. *
  40. *    LONG LT_GetAttributesA(LayoutHandle *,LONG ID,struct TagItem *);
  41. *
  42. *    Value = LT_GetAttributes(Handle,ID,...);
  43. *
  44. *    LONG LT_GetAttributes(LayoutHandle *,LONG ID,...);
  45. *
  46. *   FUNCTION
  47. *    All objects created by the user interface layout code posess
  48. *    certain unique properties. The LT_GetAttributes() function will
  49. *    will inquire this information and return it. The implementation
  50. *    differs from gadtools.library/GT_GetGadgetAttrs in that you
  51. *    can inquire only a small subset of the object properties possible
  52. *    via the taglist passed in.
  53. *
  54. *   INPUTS
  55. *    Handle - Pointer to LayoutHandle structure.
  56. *
  57. *    ID - ID number of the object to inquire information about. This
  58. *        is the same value you passed via LA_ID to LT_New() when
  59. *        you created this object.
  60. *
  61. *    Tags - TagItem list to receive information about the object
  62. *        in question.
  63. *
  64. *
  65. *    LA_Left (LONG *) - Left edge of object.
  66. *
  67. *    LA_Top (LONG *) - Top edge of object.
  68. *
  69. *    LA_Width (LONG *) - Width of object.
  70. *
  71. *    LA_Height (LONG *) - Height of object.
  72. *
  73. *    LA_Chars (LONG *) - Width of object measured in character
  74. *        widths. (V9)
  75. *
  76. *    LA_Lines (LONG *) - Height of object measured in character
  77. *        heights. (V9)
  78. *
  79. *    LA_LabelLeft (LONG *) - Left edge of label text. (V9)
  80. *
  81. *    LA_LabelTop (LONG *) - Top edge of label text. (V9)
  82. *
  83. *    LABO_Object (Object *) - Returns a pointer to the BOOPSI object
  84. *        the BOOPSI_KIND object is based upon. (V10)
  85. *
  86. *            NOTE: Don't unlink the object or dispose of it or
  87. *                terrible things are bound to happen.
  88. *
  89. *   RESULT
  90. *    The result depends on the object type:
  91. *
  92. *        VERTICAL_KIND:
  93. *        HORIZONTAL_KIND:
  94. *
  95. *            active page
  96. *
  97. *        SCROLLER_KIND:
  98. *
  99. *            current GTSC_Top value
  100. *
  101. *        TAPEDECK_KIND:
  102. *
  103. *            current LATD_Pressed value
  104. *
  105. *        LEVEL_KIND:
  106. *
  107. *            current LAVL_Level state
  108. *
  109. *        CHECKBOX_KIND:
  110. *
  111. *            current GTCB_Checked state
  112. *
  113. *        LISTVIEW_KIND:
  114. *
  115. *            current GTLV_Selected state
  116. *
  117. *        MX_KIND:
  118. *
  119. *            current GTMX_Active state
  120. *
  121. *        CYCLE_KIND:
  122. *
  123. *            current GTCY_Active state
  124. *
  125. *        POPUP_KIND:
  126. *
  127. *            current LAPU_Active state
  128. *
  129. *        TAB_KIND:
  130. *
  131. *            current LATB_Active state
  132. *
  133. *        PALETTE_KIND:
  134. *
  135. *            current GTPA_Color state
  136. *
  137. *        SLIDER_KIND:
  138. *
  139. *            current GTSL_Level state
  140. *
  141. *        GAUGE_KIND:
  142. *
  143. *            current LAGA_Percent state
  144. *
  145. *        STRING_KIND:
  146. *
  147. *            pointer to current string
  148. *
  149. *        PASSWORD_KIND:
  150. *
  151. *            pointer to current string
  152. *
  153. *        INTEGER_KIND:
  154. *
  155. *            number currently entered
  156. *
  157. *        BOOPSI_KIND:
  158. *
  159. *            whatever the object thinks is its
  160. *            current value
  161. *
  162. ******************************************************************************
  163. *
  164. */
  165.  
  166. LONG LIBENT
  167. LT_GetAttributesA(REG(a0) LayoutHandle *Handle,REG(d0) LONG ID,REG(a1) struct TagItem *TagList)
  168. {
  169.     if(Handle)
  170.     {
  171.         struct TagItem    *ThisTag;
  172.         ObjectNode        *Node = NULL;
  173.  
  174.         if(ThisTag = FindTagItem(LAPR_Gadget,TagList))
  175.             Node = ((struct Gadget *)ThisTag->ti_Data)->UserData;
  176.  
  177.         if(!Node)
  178.         {
  179.             if(ThisTag = FindTagItem(LAPR_Object,TagList))
  180.                 Node = (ObjectNode *)ThisTag->ti_Data;
  181.         }
  182.  
  183.         if(!Node)
  184.             Node = LTP_FindNode(Handle,ID);
  185.  
  186.         if(Node)
  187.         {
  188.             struct Gadget *Gadget = Node->Host;
  189.  
  190.             if(TagList)
  191.             {
  192.                 struct TagItem    *TagItem,
  193.                                 *TempPtr = TagList;
  194.                 LONG            *Value;
  195.  
  196.                 while(TagItem = NextTagItem(&TempPtr))
  197.                 {
  198.                     Value = (LONG *)TagItem->ti_Data;
  199.  
  200.                     switch(TagItem->ti_Tag)
  201.                     {
  202.                         case LA_Left:
  203.  
  204.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  205.                                 *Value = Node->Left + 4;
  206.                             else
  207.                                 *Value = Node->Left;
  208.  
  209.                             break;
  210.  
  211.                         case LA_Top:
  212.  
  213.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  214.                                 *Value = Node->Top + 2;
  215.                             else
  216.                                 *Value = Node->Top;
  217.  
  218.                             break;
  219.  
  220.                         case LA_Width:
  221.  
  222.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  223.                                 *Value = Node->Width - 8;
  224.                             else
  225.                                 *Value = Node->Width;
  226.  
  227.                             break;
  228.  
  229.                         case LA_Height:
  230.  
  231.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  232.                                 *Value = Node->Height - 4;
  233.                             else
  234.                                 *Value = Node->Height;
  235.  
  236.                             break;
  237.  
  238. #ifdef DO_BOOPSI_KIND
  239.                         case LABO_Object:
  240.  
  241.                             if(Node->Type == BOOPSI_KIND)
  242.                                 *Value = (LONG)Node->Host;
  243.                             else
  244.                                 *Value = NULL;
  245.  
  246.                             break;
  247. #endif    /* DO_BOOPSI_KIND */
  248.                         case LA_Chars:
  249.  
  250.                             *Value = Node->Chars;
  251.                             break;
  252.  
  253.                         case LA_Lines:
  254.  
  255.                             *Value = Node->Lines;
  256.                             break;
  257.  
  258.                         case LA_LabelLeft:
  259.  
  260.                             switch(Node->LabelPlace)
  261.                             {
  262.                                 case PLACE_LEFT:
  263.  
  264.                                     *Value    = Node->Left - (INTERWIDTH + Node->LabelWidth);
  265.                                     break;
  266.  
  267.                                 case PLACE_RIGHT:
  268.  
  269.                                     *Value    = Node->Left + Node->Width + INTERWIDTH;
  270.                                     break;
  271.  
  272.                                 case PLACE_ABOVE:
  273.  
  274.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  275.                                     break;
  276.  
  277.                                 case PLACE_BELOW:
  278.  
  279.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  280.                                     break;
  281.  
  282.                                 case PLACE_IN:
  283.  
  284.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  285.                                     break;
  286.                             }
  287.  
  288.                             break;
  289.  
  290.                         case LA_LabelTop:
  291.  
  292.                             switch(Node->LabelPlace)
  293.                             {
  294.                                 case PLACE_LEFT:
  295.  
  296.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  297.                                     break;
  298.  
  299.                                 case PLACE_RIGHT:
  300.  
  301.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  302.                                     break;
  303.  
  304.                                 case PLACE_ABOVE:
  305.  
  306.                                     *Value    = Node->Top - (Handle->GlyphHeight + INTERHEIGHT);
  307.                                     break;
  308.  
  309.                                 case PLACE_BELOW:
  310.  
  311.                                     *Value    = Node->Top + Node->Height + INTERHEIGHT;
  312.                                     break;
  313.  
  314.                                 case PLACE_IN:
  315.  
  316.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  317.                                     break;
  318.                             }
  319.  
  320.                             break;
  321.                     }
  322.                 }
  323.             }
  324.  
  325.             switch(Node->Type)
  326.             {
  327.                 case CHECKBOX_KIND:
  328.                 case LISTVIEW_KIND:
  329.                 case MX_KIND:
  330.                 case CYCLE_KIND:
  331.                 case PALETTE_KIND:
  332.                 case SLIDER_KIND:
  333.                 case SCROLLER_KIND:
  334. #if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
  335.                 case POPUP_KIND:
  336. #endif
  337. #if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
  338.                 case TAB_KIND:
  339. #endif
  340. #ifdef DO_GAUGE_KIND
  341.                 case GAUGE_KIND:
  342. #endif
  343. #ifdef DO_TAPEDECK_KIND
  344.                 case TAPEDECK_KIND:
  345. #endif    /* DO_TAPEDECK_KIND */
  346.                     return(Node->Current);
  347. #ifdef DO_BOOPSI_KIND
  348.                 case BOOPSI_KIND:
  349.                 {
  350.                     ULONG Storage;
  351.  
  352.                     if(Gadget && GetAttr(Node->Special.BOOPSI.TagCurrent,Gadget,&Storage))
  353.                         return((LONG)Storage);
  354.                     else
  355.                         return(NULL);
  356.                 }
  357. #endif    /* DO_BOOPSI_KIND */
  358.  
  359.                 case VERTICAL_KIND:
  360.                 case HORIZONTAL_KIND:
  361.  
  362.                     return((LONG)Node->Special.Group.ActivePage);
  363.  
  364. #ifdef DO_LEVEL_KIND
  365.                 case LEVEL_KIND:
  366.  
  367.                     return(Node->Current);
  368. #endif    /* DO_LEVEL_KIND */
  369.                 case STRING_KIND:
  370.  
  371.                     if(Gadget)
  372.                     {
  373.                         struct StringInfo *StringInfo;
  374.  
  375.                         StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
  376.  
  377.                         return((LONG)StringInfo->Buffer);
  378.                     }
  379.                     else
  380.                     {
  381.                         STRPTR String = Node->Special.String.String;
  382.  
  383.                         if(!String)
  384.                             String = "";
  385.  
  386.                         return((LONG)String);
  387.                     }
  388.  
  389.                     break;
  390.  
  391. #ifdef DO_PASSWORD_KIND
  392.                 case PASSWORD_KIND:
  393.  
  394.                     return((LONG)Node->Special.String.RealString);
  395. #endif
  396.  
  397.                 case INTEGER_KIND:
  398.  
  399.                     if(Gadget)
  400.                     {
  401.                         struct StringInfo    *StringInfo;
  402.                         LONG                 Contents;
  403.  
  404.                         StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
  405.  
  406.                         Contents = StringInfo->LongInt;
  407.  
  408.                         if(Contents < Node->Min)
  409.                             Contents = Node->Min;
  410.                         else
  411.                         {
  412.                             if(Contents > Node->Max)
  413.                                 Contents = Node->Max;
  414.                         }
  415.  
  416.                         LT_SetAttributes(Handle,0,
  417.                             LAPR_Object,    Node,
  418.                             GTIN_Number,    Contents,
  419.                         TAG_DONE);
  420.  
  421.                         return(Contents);
  422.                     }
  423.                     else
  424.                         return(Node->Special.Integer.Number);
  425.  
  426.                     break;
  427.  
  428.                 case GROUP_KIND:
  429.  
  430.                     return((LONG)Node->Special.Group.ActivePage);
  431.             }
  432.         }
  433.         else
  434.             return((LONG)Handle->UserData);
  435.     }
  436.  
  437.     return(NULL);
  438. }
  439.